@南馆潇湘
2年前 提问
1个回答

缓冲区溢出攻击的预防措施

安全小白成长记
2年前

由于缓冲区溢出攻击可能带来严重的后果,所以要采取措施对缓冲区溢出攻击进行防御。目前有如下几种措施可以保护缓冲区免受缓冲区溢出的攻击和影响。

关闭不必要的端口或服务

管理员应该知道自己的系统上安装了什么,并且哪些服务正在运行。

及时更新漏洞补丁

安装软件厂商的补丁,漏洞一公布,大的厂商就会及时提供补丁。

过滤特殊的流量

在防火墙上过滤特殊的流量,无法阻止内部人员的溢出攻击。

编写正确的代码

编写正确的代码是一件非常有意义但耗时的工作,特别像编写C语言那种具有容易出错倾向的程序。尽管花了很长的时间使得人们知道了如何编写安全的程序,具有安全漏洞的程序依旧出现。因此需要开发了一些工具和技术来帮助经验不足的程序员编写安全、正确的程序。

非执行的缓冲区

通过使被攻击程序的数据段地址空间不可执行,从而使得攻击者不可能执行植入被攻击程序输入缓冲区的代码,这种技术被称为非执行的缓冲区技术。但Windows系统为了实现更好的性能和功能,往往在数据段中动态地放入可执行的代码。但为了保持程序的兼容性,不可能使所有程序的数据段不可执行,所以缓冲区漏洞还是存在的。

数组边界检查

该种方式和非执行缓冲区的不同在于:数组边界检查完全放置了缓冲区溢出的产生和攻击。所以只要数组不溢出,溢出攻击也就无从谈起。为了实现数组边界检查,则所有的对数组的读写操作都应该进行检查,以确保对数组的操作在正确的范围内。最直接的方法是检查所有的数组操作,但是通常可以采用一些优化的技术来减少检查的次数。

程序指针完整性检查

程序指针完整性检查和边界检查略微不同:程序指针完整性检查在程序指针被引用之前检测到它的改变。即使一个攻击者成功地改变了程序的指针,由于系统事先检测到了指针的改变,所以这个指针将不会被使用。程序指针完整性检查不能解决所有的缓冲区溢出问题,但是这种方法在性能上有很大的优势,而且其兼容性也很好。